// Copyright Epic Games, Inc. All Rights Reserved.

#include "LyraBotCheats.h"
#include "Engine/World.h"
#include "GameFramework/CheatManagerDefines.h"
#include "GameModes/LyraBotCreationComponent.h"

#include UE_INLINE_GENERATED_CPP_BY_NAME(LyraBotCheats)

//////////////////////////////////////////////////////////////////////
// ULyraBotCheats

/**
 * 构造函数，在具有服务器代码且启用作弊管理器时，将此类注册为作弊管理器扩展
 */
ULyraBotCheats::ULyraBotCheats()
{
#if WITH_SERVER_CODE && UE_WITH_CHEAT_MANAGER
	// 检查是否是类默认对象
	if (HasAnyFlags(RF_ClassDefaultObject))
	{
		// 注册作弊管理器创建时的回调，将此类添加为作弊管理器扩展
		UCheatManager::RegisterForOnCheatManagerCreated(FOnCheatManagerCreated::FDelegate::CreateLambda(
			[](UCheatManager* CheatManager)
			{
				CheatManager->AddCheatManagerExtension(NewObject<ThisClass>(CheatManager));
			}));
	}
#endif
}

/**
 * 执行添加机器人玩家的作弊命令
 */
void ULyraBotCheats::AddPlayerBot()
{
#if WITH_SERVER_CODE && UE_WITH_CHEAT_MANAGER
	// 获取机器人创建组件
	if (ULyraBotCreationComponent* BotComponent = GetBotComponent())
	{
		// 调用组件的添加机器人作弊方法
		BotComponent->Cheat_AddBot();
	}
#endif	
}

/**
 * 执行移除机器人玩家的作弊命令
 */
void ULyraBotCheats::RemovePlayerBot()
{
#if WITH_SERVER_CODE && UE_WITH_CHEAT_MANAGER
	// 获取机器人创建组件
	if (ULyraBotCreationComponent* BotComponent = GetBotComponent())
	{
		// 调用组件的移除机器人作弊方法
		BotComponent->Cheat_RemoveBot();
	}
#endif	
}

/**
 * 从当前游戏状态中查找并返回机器人创建组件
 * @return 指向机器人创建组件的指针，如果未找到则返回nullptr
 */
ULyraBotCreationComponent* ULyraBotCheats::GetBotComponent() const
{
	// 获取当前世界
	if (UWorld* World = GetWorld())
	{
		// 获取游戏状态
		if (AGameStateBase* GameState = World->GetGameState())
		{
			// 查找并返回机器人创建组件
			return GameState->FindComponentByClass<ULyraBotCreationComponent>();
		}
	}

	// 如果未找到，返回nullptr
	return nullptr;
}